<!DOCTYPE html>
<html>
<head>

</head>
<body>

	<div id="stagemonitor-overlay" style="display: none;">
		<iframe id="stagemonitor-modal"></iframe>
	</div>

	<script src="../../main/resources/stagemonitor/public/static/rum/boomerang.js"></script>
	<script>
		BOOMR.init({
			beacon_url: '/stagemonitor/public/static/rum',
			log: null
		});
		BOOMR.addVar("requestId", "asdf");
		BOOMR.addVar("requestName", "Show Owner");
		BOOMR.addVar("serverTime", 19);
	</script>
	<script type="text/javascript">
		(function () {
			if (typeof(BOOMR) != 'undefined') {
				BOOMR.subscribe('before_beacon', function(data) {
					data = {
						timeToFirstByte: 29,
						domProcessing: 90,
						pageRendering: 110,
						totalPageLoadTime: 229,
						serverTime: 19
					};
					if (data.totalPageLoadTime) {
						var stagemonitorWindow = document.getElementById("stagemonitor-modal").contentWindow;
						if (stagemonitorWindow.stagemonitor) {
							stagemonitorWindow.stagemonitor.renderPageLoadTime(data);
						} else {
							stagemonitorWindow.pageLoadTime = data;
						}
						var thresholdExceeded = stagemonitorWindow.stagemonitor.thresholdExceeded;
						var clazz = thresholdExceeded ? "stagemonitor-threshold-exceeded" : "stagemonitor-threshold-ok";
						document.getElementById("stagemonitor-overlay-show").className = clazz;
					}
				});
			}

			var stagemonitorWindow = document.getElementById("stagemonitor-modal").contentWindow;
			var contextPath = "/stagemonitor-web/src/main/resources";

			var xmlhttp = new XMLHttpRequest();
			xmlhttp.onreadystatechange = function () {
				if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
					var doc = stagemonitorWindow.document;
					doc.open();
					doc.write(xmlhttp.responseText
							.split("href=\"").join("href=\"" + contextPath)
							.split("src=\"").join("src=\"" + contextPath));
					doc.close();
				}
			};
			xmlhttp.open("GET", "../../main/resources/stagemonitor/static/stagemonitor-modal.html", true);
			xmlhttp.send();

			window.StagemonitorLoaded = function () {
				function isDomLoaded() {
					return document.readyState === "complete";
				}
				if (isDomLoaded()) {
					init();
				} else {
					document.onreadystatechange = function () {
						if (isDomLoaded()) {
							init();
						}
					};
				}
				function init() {
					var stagemonitorWindow = document.getElementById("stagemonitor-modal").contentWindow,
							stagemonitorOverlayShow = document.getElementById("stagemonitor-overlay-show"),
							stagemonitorOverlay = document.getElementById("stagemonitor-overlay"),
							data = {"name":"Show Owner","executionTime":19,"executionTimeDb":1,"executionCountDb":3,"executionTimeCpu":31,"error":false,"parameter":"","clientIp":"127.0.0.1","url":"/petclinic/owners/2.html","statusCode":200,"headers":{"cache-control":"max-age=0","connection":"keep-alive","accept-language":"de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4","host":"localhost:8888","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8","user-agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36","accept-encoding":"gzip,deflate,sdch","referer":"http://localhost:8888/petclinic/owners.html?lastName="},"method":"GET","userAgent":{"type":"Browser","device":"Personal computer","os":"Windows 7","osFamily":"Windows","osVersion":"6.1","browser":"Chrome","browserVersion":"36.0.1985.143"},"callStackJson":"{\"signature\": \"Show Owner\", \"executionTime\": 10883747, \"children\": [ { \"signature\": \"void org.springframework.web.servlet.FrameworkServlet.service(HttpServletRequest, HttpServletResponse)\", \"executionTime\": 10574557, \"children\": [ { \"signature\": \"void org.springframework.web.servlet.DispatcherServlet.doService(HttpServletRequest, HttpServletResponse)\", \"executionTime\": 10475833, \"children\": [ { \"signature\": \"void org.springframework.web.servlet.DispatcherServlet.doDispatch(HttpServletRequest, HttpServletResponse)\", \"executionTime\": 10460206, \"children\": [ { \"signature\": \"HandlerExecutionChain org.springframework.web.servlet.DispatcherServlet.getHandler(HttpServletRequest)\", \"executionTime\": 238388, \"children\": [], \"shortSignature\": \"DispatcherServlet#getHandler\", \"ioquery\": false, \"netExecutionTime\": 238388 }, { \"signature\": \"ModelAndView org.springframework.samples.petclinic.web.OwnerController.showOwner(int)\", \"executionTime\": 5993055, \"children\": [ { \"signature\": \"Owner org.springframework.samples.petclinic.service.ClinicServiceImpl.findOwnerById(int)\", \"executionTime\": 4786388, \"children\": [ { \"signature\": \"Object org.springframework.samples.petclinic.util.CallMonitoringAspect.invoke(ProceedingJoinPoint)\", \"executionTime\": 4754666, \"children\": [ { \"signature\": \"Owner org.springframework.samples.petclinic.repository.jpa.JpaOwnerRepositoryImpl.findById(int)\", \"executionTime\": 4723207, \"children\": [ { \"signature\": \"select owner0_.id as id1_0_0_, pets1_.id as id1_1_1_, owner0_.first_name as first_na2_0_0_, owner0_.last_name as last_nam3_0_0_, owner0_.address as address4_0_0_, owner0_.city as city5_0_0_, owner0_.telephone as telephon6_0_0_, pets1_.name as name2_1_1_, pets1_.birth_date as birth_da3_1_1_, pets1_.owner_id as owner_id4_1_1_, pets1_.type_id as type_id5_1_1_, pets1_.owner_id as owner_id4_0_0__, pets1_.id as id1_1_0__ from owners owner0_ left outer join pets pets1_ on owner0_.id=pets1_.owner_id where owner0_.id=11 \", \"executionTime\": 0, \"children\": [], \"shortSignature\": null, \"ioquery\": true, \"netExecutionTime\": 0 }, { \"signature\": \"select pettype0_.id as id1_3_0_, pettype0_.name as name2_3_0_ from types pettype0_ where pettype0_.id=2 \", \"executionTime\": 0, \"children\": [], \"shortSignature\": null, \"ioquery\": true, \"netExecutionTime\": 0 }, { \"signature\": \"select visits0_.pet_id as pet_id4_1_0_, visits0_.id as id1_6_0_, visits0_.id as id1_6_1_, visits0_.visit_date as visit_da2_6_1_, visits0_.description as descript3_6_1_, visits0_.pet_id as pet_id4_6_1_ from visits visits0_ where visits0_.pet_id=14 \", \"executionTime\": 0, \"children\": [], \"shortSignature\": null, \"ioquery\": true, \"netExecutionTime\": 0 } ], \"shortSignature\": \"JpaOwnerRepositoryImpl#findById\", \"ioquery\": false, \"netExecutionTime\": 4723207 } ], \"shortSignature\": \"CallMonitoringAspect#invoke\", \"ioquery\": false, \"netExecutionTime\": 31459 } ], \"shortSignature\": \"ClinicServiceImpl#findOwnerById\", \"ioquery\": false, \"netExecutionTime\": 31722 } ], \"shortSignature\": \"OwnerController#showOwner\", \"ioquery\": false, \"netExecutionTime\": 1206667 }, { \"signature\": \"void org.springframework.web.servlet.DispatcherServlet.processDispatchResult(HttpServletRequest, HttpServletResponse, HandlerExecutionChain, ModelAndView, Exception)\", \"executionTime\": 3370432, \"children\": [ { \"signature\": \"void org.springframework.web.servlet.DispatcherServlet.render(ModelAndView, HttpServletRequest, HttpServletResponse)\", \"executionTime\": 3363760, \"children\": [ { \"signature\": \"Just another IO QUERY!  \", \"executionTime\": 401973, \"children\": [], \"shortSignature\": null, \"ioquery\": true, \"netExecutionTime\": 401973 } ], \"shortSignature\": \"DispatcherServlet#render\", \"ioquery\": false, \"netExecutionTime\": 2961787 } ], \"shortSignature\": \"DispatcherServlet#processDispatchResult\", \"ioquery\": false, \"netExecutionTime\": 6672 } ], \"shortSignature\": \"DispatcherServlet#doDispatch\", \"ioquery\": false, \"netExecutionTime\": 858331 } ], \"shortSignature\": \"DispatcherServlet#doService\", \"ioquery\": false, \"netExecutionTime\": 15627 } ], \"shortSignature\": \"FrameworkServlet#service\", \"ioquery\": false, \"netExecutionTime\": 98724 } ], \"shortSignature\": null, \"ioquery\": false, \"netExecutionTime\": 309190 }","@timestamp":"2014-08-23T13:11:50.796+0200","@application":"Spring PetClinic","@host":"Felix-PC","@instance":"localhost"},
							configurationSources = {"Transient Configuration Source":true,"Java System Properties":false,"stagemonitor.properties":true},
							configurationOptions = {"Web Plugin":[{"dynamic":true,"sensitive":false,"key":"stagemonitor.requestmonitor.http.requestparams.confidential.regex","label":"Deprecated: Confidential request parameters (regex)","description":"Deprecated, use stagemonitor.requestmonitor.requestparams.confidential.regex instead.A list of request parameter name patterns that should not be collected.nA request parameter is either a query string or a application/x-www-form-urlencoded request body (POST form content)","tags":["security-relevant","deprecated"],"defaultValueAsString":"(?i).*pass.*, (?i).*credit.*, (?i).*pwd.*","configurationCategory":"Web Plugin","valueType":"Collection","valueAsString":"(?i).*pass.*, (?i).*credit.*, (?i).*pwd.*","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.requestmonitor.http.collectHeaders","label":"Collect HTTP headers","description":"Whether or not HTTP headers should be collected with a call stack.","tags":["security-relevant"],"defaultValueAsString":"true","configurationCategory":"Web Plugin","valueType":"Boolean","valueAsString":"true","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.requestmonitor.http.parseUserAgent","label":"Analyze user agent","description":"Whether or not the user-agent header should be parsed and analyzed to get information about the browser, device type and operating system.","tags":[],"defaultValueAsString":"true","configurationCategory":"Web Plugin","valueType":"Boolean","valueAsString":"true","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.requestmonitor.http.headers.excluded","label":"Do not collect headers","description":"A list of (case insensitive) header names that should not be collected.","tags":["security-relevant"],"defaultValueAsString":"cookie, authorization, X-Stagemonitor-Show-Widget","configurationCategory":"Web Plugin","valueType":"Collection","valueAsString":"cookie, authorization, X-Stagemonitor-Show-Widget","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.web.widget.enabled","label":"In browser widget enabled","description":"If active, stagemonitor will inject a widget in the web site containing the call tree. If disabled, you can still enable it for authorized users by sending the HTTP header `X-Stagemonitor-Show-Widget: <stagemonitor.password>`. You can use browser plugins like Modify Headers for this. Note: if `stagemonitor.password` is set to an empty string, you can't disable the widget.nRequires Servlet-Api >= 3.0","tags":[],"defaultValueAsString":"true","configurationCategory":"Web Plugin","valueType":"Boolean","valueAsString":"true","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.groupUrls","label":"Group URLs regex","description":"Combine url paths by regex to a single url group.nE.g. `(.*).js: *.js` combines all URLs that end with `.js` to a group named `*.js`. The metrics for all URLs matching the pattern are consolidated and shown in one row in the request table. The syntax is `<regex>: <group name>[, <regex>: <group name>]*`","tags":[],"defaultValueAsString":"(.*).js$: *.js,n(.*).css$: *.css,n(.*).jpg$: *.jpg,n(.*).jpeg$: *.jpeg,n(.*).png$: *.png","configurationCategory":"Web Plugin","valueType":"Map","valueAsString":"(.*).js$: *.js,n(.*).css$: *.css,n(.*).jpg$: *.jpg,n(.*).jpeg$: *.jpeg,n(.*).png$: *.png","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.web.rum.enabled","label":"Enable Real User Monitoring","description":"The Real User Monitoring feature collects the browser, network and overall percieved execution time from the user's perspective. When activated, a piece of javascript will be injected to each html page that collects the data from real users and sends it back to the server. Servlet API 3.0 or higher is required for this.","tags":[],"defaultValueAsString":"true","configurationCategory":"Web Plugin","valueType":"Boolean","valueAsString":"true","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.web.collectPageLoadTimesPerRequest","label":"Collect Page Load Time data per request group","description":"Whether or not browser, network and overall execution time should be collected per request group.nIf set to true, four additional timers will be created for each request group to record the page rendering time, dom processing time, network time and overall time per request. If set to false, the times of all requests will be aggregated.","tags":[],"defaultValueAsString":"false","configurationCategory":"Web Plugin","valueType":"Boolean","valueAsString":"false","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.web.paths.excluded","label":"Excluded paths","description":"Request paths that should not be monitored. A value of `/aaa` means, that all paths starting with `/aaa` should not be monitored. It's recommended to not monitor static resources, as they are typically not interesting to monitor but consume resources when you do.","tags":[],"defaultValueAsString":"/VAADIN/, /HEARTBEAT/","configurationCategory":"Web Plugin","valueType":"Collection","valueAsString":"/VAADIN/, /HEARTBEAT/","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.web.monitorOnlyForwardedRequests","label":"Monitor only forwarded requests","description":"Sometimes you only want to monitor forwarded requests, for example if you have a rewrite filter that translates a external URI (/a) to a internal URI (/b). If only /b should be monitored,set the value to true.","tags":[],"defaultValueAsString":"false","configurationCategory":"Web Plugin","valueType":"Boolean","valueAsString":"false","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.web.metricsServlet.allowedOrigin","label":"Allowed origin","description":"The Access-Control-Allow-Origin header value for the metrics servlet.","tags":[],"defaultValueAsString":null,"configurationCategory":"Web Plugin","valueType":"String","valueAsString":null,"nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.web.metricsServlet.jsonpParameter","label":"The Jsonp callback parameter name","description":"The name of the parameter used to specify the jsonp callback.","tags":[],"defaultValueAsString":null,"configurationCategory":"Web Plugin","valueType":"String","valueAsString":null,"nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.requestmonitor.requestExceptionAttributes","label":"Request Exception Attributes","description":"Defines the list of attribute names to check on the HttpServletRequest when searching for an exception. nnStagemonitor searches this list in order to see if any of these attributes are set on the request with an Exception object and then records that information on the request trace. If your web framework sets a different attribute outside of the defaults, you can add that attribute to this list to properly record the exception on the trace.","tags":[],"defaultValueAsString":"javax.servlet.error.exception, exception, org.springframework.web.servlet.DispatcherServlet.EXCEPTION","configurationCategory":"Web Plugin","valueType":"Collection","valueAsString":"javax.servlet.error.exception, exception, org.springframework.web.servlet.DispatcherServlet.EXCEPTION","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.web.honorDoNotTrackHeader","label":"Honor do not track header","description":"When set to true, requests that include the dnt header won't be reported. Depending on your use case you might not be required to stop reporting request traces even if dnt is set. See https://tools.ietf.org/html/draft-mayer-do-not-track-00#section-9.3","tags":["privacy"],"defaultValueAsString":"false","configurationCategory":"Web Plugin","valueType":"Boolean","valueAsString":"false","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null}],"Spring MVC Plugin":[{"dynamic":true,"sensitive":false,"key":"stagemonitor.requestmonitor.spring.monitorOnlySpringMvcRequests","label":"Monitor only SpringMVC requests","description":"Whether or not requests should be ignored, if they will not be handled by a Spring MVC controller method.nThis is handy, if you are not interested in the performance of serving static files. Setting this to true can also significantly reduce the amount of files (and thus storing space) Graphite will allocate.","tags":[],"defaultValueAsString":"false","configurationCategory":"Spring MVC Plugin","valueType":"Boolean","valueAsString":"false","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null}],"Resteasy Plugin":[{"dynamic":true,"sensitive":false,"key":"stagemonitor.requestmonitor.resteasy.monitorOnlyResteasyRequests","label":"Monitor only Resteasy reqeusts","description":"Whether or not requests should be ignored, if they will not be handled by a Resteasy resource method.nThis is handy, if you are not interested in the performance of serving static files. Setting this to true can also significantly reduce the amount of files (and thus storing space) Graphite will allocate.","tags":[],"defaultValueAsString":"false","configurationCategory":"Resteasy Plugin","valueType":"Boolean","valueAsString":"false","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null}],"EhCache Plugin":[{"dynamic":false,"sensitive":false,"key":"stagemonitor.ehcache.name","label":"EhCache cache name","description":"The name of the ehcache to instrument (the value of the `name` attribute of the `ehcache` tag in ehcache.xml)","tags":[],"defaultValueAsString":null,"configurationCategory":"EhCache Plugin","valueType":"String","valueAsString":null,"nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.ehcache.get.timer","label":"Create timer for cache gets","description":"If set to true, a timer for each cache will be created which measures the time to get a element from the cache. If you have a lot of caches, that could lead to a increased network and disk utilisation. If set to false, only a meter (which measures the rate) will be created","tags":[],"defaultValueAsString":"false","configurationCategory":"EhCache Plugin","valueType":"Boolean","valueAsString":"false","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null}],"Alerting":[{"dynamic":true,"sensitive":false,"key":"stagemonitor.alerts.mute","label":"Mute alerts","description":"If set to `true`, alerts will be muted.","tags":[],"defaultValueAsString":"false","configurationCategory":"Alerting","valueType":"Boolean","valueAsString":"false","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.alerts.frequency","label":"Threshold check frequency (sec)","description":"The threshold check frequency in seconds.","tags":[],"defaultValueAsString":"60","configurationCategory":"Alerting","valueType":"Long","valueAsString":"60","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.alerts.subscriptions","label":"Alert Subscriptions","description":"The alert subscriptions.","tags":[],"defaultValueAsString":"{}","configurationCategory":"Alerting","valueType":"Map","valueAsString":"{}","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.alerts.checks","label":"Check Groups","description":"The check groups that contain thresholds for metrics.","tags":[],"defaultValueAsString":"{}","configurationCategory":"Alerting","valueType":"Map","valueAsString":"{}","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.alerts.smtp.host","label":"SMTP Mailhost","description":null,"tags":[],"defaultValueAsString":null,"configurationCategory":"Alerting","valueType":"String","valueAsString":null,"nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":true,"key":"stagemonitor.alerts.smtp.password","label":"SMTP-Password","description":null,"tags":[],"defaultValueAsString":null,"configurationCategory":"Alerting","valueType":"String","valueAsString":null,"nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.alerts.smtp.user","label":"SMTP-User name","description":null,"tags":[],"defaultValueAsString":null,"configurationCategory":"Alerting","valueType":"String","valueAsString":null,"nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.alerts.smtp.protocol","label":"SMTP-Protocol","description":null,"tags":[],"defaultValueAsString":"smtp","configurationCategory":"Alerting","valueType":"String","valueAsString":"smtp","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.alerts.smtp.port","label":"SMTP-Port","description":null,"tags":[],"defaultValueAsString":"25","configurationCategory":"Alerting","valueType":"Integer","valueAsString":"25","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.alerts.smtp.from","label":"SMTP-From","description":"The from email address for sending notifications.","tags":[],"defaultValueAsString":"alert@stagemonitor.org","configurationCategory":"Alerting","valueType":"String","valueAsString":"alert@stagemonitor.org","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":true,"key":"stagemonitor.alerts.pushbullet.accessToken","label":"Pushbullet Access Token","description":"The Access Token for the Pushbullet API. You can find it in your Pushbullet account settings.","tags":[],"defaultValueAsString":null,"configurationCategory":"Alerting","valueType":"String","valueAsString":null,"nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.alerts.template.html","label":"Alerts HTML freemarker template","description":null,"tags":[],"defaultValueAsString":"<#-- @ftlvariable name=\"incident\" type=\"org.stagemonitor.alerting.incident.Incident\" -->n<h3>Incident for check ${incident.checkName}</h3>nFirst failure: ${incident.firstFailureAt?datetime?iso_local}<br>n<#if incident.resolvedAt??>nResolved at: ${incident.resolvedAt?datetime?iso_local}<br>n</#if>nOld status: ${incident.oldStatus!'OK'}<br>nNew status: ${incident.newStatus}<br>n<#if incident.failedChecks gt 0>Failing check<#if incident.failedChecks gt 1>s</#if>: ${incident.failedChecks}<br>nHosts: ${incident.hosts?join(\", \")}<br>nInstances: ${incident.instances?join(\", \")}<br><br>nnt<#if incident.checkResults?has_content>n<table>nt<thead>nt<tr>ntt<th>Host</th>ntt<th>Instance</th>ntt<th>Status</th>ntt<th>Description</th>ntt<th>Current Value</th>nt</tr>nt</thead>nt<tbody>ntt<#list incident.checkResults as results>nttt<#assign measurementSession=results.measurementSession/>nttt<#list results.getResults() as result>nttt<tr>ntttt<td>${measurementSession.hostName}</td>ntttt<td>${measurementSession.instanceName}</td>ntttt<td>${result.status}</td>ntttt<td>${result.failingExpression}</td>ntttt<td>${result.currentValue}</td>nttt</tr>nttt</#list>ntt</#list>nt</tbody>n</table>nt</#if>n</#if>n","configurationCategory":"Alerting","valueType":"String","valueAsString":"<#-- @ftlvariable name=\"incident\" type=\"org.stagemonitor.alerting.incident.Incident\" -->n<h3>Incident for check ${incident.checkName}</h3>nFirst failure: ${incident.firstFailureAt?datetime?iso_local}<br>n<#if incident.resolvedAt??>nResolved at: ${incident.resolvedAt?datetime?iso_local}<br>n</#if>nOld status: ${incident.oldStatus!'OK'}<br>nNew status: ${incident.newStatus}<br>n<#if incident.failedChecks gt 0>Failing check<#if incident.failedChecks gt 1>s</#if>: ${incident.failedChecks}<br>nHosts: ${incident.hosts?join(\", \")}<br>nInstances: ${incident.instances?join(\", \")}<br><br>nnt<#if incident.checkResults?has_content>n<table>nt<thead>nt<tr>ntt<th>Host</th>ntt<th>Instance</th>ntt<th>Status</th>ntt<th>Description</th>ntt<th>Current Value</th>nt</tr>nt</thead>nt<tbody>ntt<#list incident.checkResults as results>nttt<#assign measurementSession=results.measurementSession/>nttt<#list results.getResults() as result>nttt<tr>ntttt<td>${measurementSession.hostName}</td>ntttt<td>${measurementSession.instanceName}</td>ntttt<td>${result.status}</td>ntttt<td>${result.failingExpression}</td>ntttt<td>${result.currentValue}</td>nttt</tr>nttt</#list>ntt</#list>nt</tbody>n</table>nt</#if>n</#if>n","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.alerts.template.plainText","label":"Alerts plain text freemarker template","description":null,"tags":[],"defaultValueAsString":"<#-- @ftlvariable name=\"incident\" type=\"org.stagemonitor.alerting.incident.Incident\" -->nIncident for check '${incident.checkName}':nFirst failure: ${incident.firstFailureAt?datetime?iso_local}n<#if incident.resolvedAt??>nResolved at: ${incident.resolvedAt?datetime?iso_local}n</#if>nOld status: ${incident.oldStatus!'OK'}nNew status: ${incident.newStatus}n<#if incident.failedChecks gt 0>Failing check<#if incident.failedChecks gt 1>s</#if>: ${incident.failedChecks}nHosts: ${incident.hosts?join(\", \")}nInstances: ${incident.instances?join(\", \")}nnDetails:n<#list incident.checkResults as results>n<#assign measurementSession=results.measurementSession/>n<#list results.getResults() as result>nHost:ttt${measurementSession.hostName}nInstance:tt${measurementSession.instanceName}nStatus: tt${result.status}nDescription:t${result.failingExpression}nCurrent value:t${result.currentValue}nn</#list></#list></#if>","configurationCategory":"Alerting","valueType":"String","valueAsString":"<#-- @ftlvariable name=\"incident\" type=\"org.stagemonitor.alerting.incident.Incident\" -->nIncident for check '${incident.checkName}':nFirst failure: ${incident.firstFailureAt?datetime?iso_local}n<#if incident.resolvedAt??>nResolved at: ${incident.resolvedAt?datetime?iso_local}n</#if>nOld status: ${incident.oldStatus!'OK'}nNew status: ${incident.newStatus}n<#if incident.failedChecks gt 0>Failing check<#if incident.failedChecks gt 1>s</#if>: ${incident.failedChecks}nHosts: ${incident.hosts?join(\", \")}nInstances: ${incident.instances?join(\", \")}nnDetails:n<#list incident.checkResults as results>n<#assign measurementSession=results.measurementSession/>n<#list results.getResults() as result>nHost:ttt${measurementSession.hostName}nInstance:tt${measurementSession.instanceName}nStatus: tt${result.status}nDescription:t${result.failingExpression}nCurrent value:t${result.currentValue}nn</#list></#list></#if>","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.alerts.template.shortDescription","label":"Alerts short description freemarker template","description":"Used for example for the email subject.","tags":[],"defaultValueAsString":"[${incident.oldStatus!'OK'} -> ${incident.newStatus}] ${incident.checkName} has ${incident.failedChecks} failing check<#if incident.failedChecks gt 1>s</#if>","configurationCategory":"Alerting","valueType":"String","valueAsString":"[${incident.oldStatus!'OK'} -> ${incident.newStatus}] ${incident.checkName} has ${incident.failedChecks} failing check<#if incident.failedChecks gt 1>s</#if>","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null}],"Request Monitor Plugin":[{"dynamic":false,"sensitive":false,"key":"stagemonitor.requestmonitor.noOfWarmupRequests","label":"Number of warmup requests","description":"the minimum number of requests that have to be issued against the application before metrics are collected","tags":[],"defaultValueAsString":"0","configurationCategory":"Request Monitor Plugin","valueType":"Integer","valueAsString":"0","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.requestmonitor.warmupSeconds","label":"Number of warmup seconds","description":"A timespan in seconds after the start of the server where no metrics are collected.","tags":[],"defaultValueAsString":"0","configurationCategory":"Request Monitor Plugin","valueType":"Integer","valueAsString":"0","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.requestmonitor.collectRequestStats","label":"Collect request stats","description":"Whether or not metrics about requests (Call Stacks, response times, errors status codes) should be collected.","tags":[],"defaultValueAsString":"true","configurationCategory":"Request Monitor Plugin","valueType":"Boolean","valueAsString":"true","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.requestmonitor.cpuTime","label":"Collect CPU time","description":"Whether or not a timer for the cpu time of executions should be created.","tags":[],"defaultValueAsString":"false","configurationCategory":"Request Monitor Plugin","valueType":"Boolean","valueAsString":"false","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.profiler.active","label":"Activate Profiler","description":"Whether or not the call tree profiler should be active.","tags":[],"defaultValueAsString":"true","configurationCategory":"Request Monitor Plugin","valueType":"Boolean","valueAsString":"true","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.profiler.minExecutionTimeNanos","label":"Min execution time (nanos)","description":"Don't show methods that executed faster than this value in the call tree (1 ms = 1,000,000 ns).","tags":[],"defaultValueAsString":"100000","configurationCategory":"Request Monitor Plugin","valueType":"Long","valueAsString":"100000","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.profiler.minExecutionTimePercent","label":"Min execution time (%)","description":"Don't show methods that executed faster than this value in the call tree (0.5 or 0,5 means 0.5%).","tags":[],"defaultValueAsString":"0.5","configurationCategory":"Request Monitor Plugin","valueType":"Double","valueAsString":"0.5","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.profiler.objectPooling","label":"Activate Profiler Object Pooling","description":"Activates the experimental object pooling feature for the profiler. When enabled, instances of CallStackElement are not garbage collected but put into an object pool when not needed anymore. When we need a new instance of CallStackElement, it is not created with `new CallStackElement()` but taken from the pool instead. This aims to reduce heap usage and garbage collections caused by stagemonitor.","tags":["experimental"],"defaultValueAsString":"false","configurationCategory":"Request Monitor Plugin","valueType":"Boolean","valueAsString":"false","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.requestmonitor.onlyCollectNCallTreesPerMinute","label":"Only report N call trees per minute","description":"Limits the rate at which call trees are collected. Set to a value below 1 to deactivate call tree recording and to 1000000 or higher to always collect.","tags":[],"defaultValueAsString":"1000000.0","configurationCategory":"Request Monitor Plugin","valueType":"Double","valueAsString":"1000000.0","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.profiler.logCallStacks","label":"Log call tree","description":"Whether or not call stacks should be logged.","tags":[],"defaultValueAsString":"false","configurationCategory":"Request Monitor Plugin","valueType":"Boolean","valueAsString":"false","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.requestmonitor.deleteRequestTracesAfterDays","label":"Delete request traces after (days)","description":"When set, call stacks will be deleted automatically after the specified days. Set to a negative value to never delete request traces.","tags":[],"defaultValueAsString":"7","configurationCategory":"Request Monitor Plugin","valueType":"Integer","valueAsString":"7","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.requestmonitor.collectExternalRequestTimePerRequest","label":"Collect external request time per request group","description":"Whether or not the execution time of external should be collected per request groupnIf set to true, a timer will be created for each request to record the total db time per request.","tags":[],"defaultValueAsString":"false","configurationCategory":"Request Monitor Plugin","valueType":"Boolean","valueAsString":"false","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.businessTransaction.namingStrategy","label":"Business Transaction naming strategy","description":"Defines how to name a business transaction that was detected by a method call. For example a Spring-MVC controller method or a method that is annotated with @MonitorRequests. METHOD_NAME_SPLIT_CAMEL_CASE: Say Hello CLASS_NAME_DOT_METHOD_NAME: HelloController.sayHello CLASS_NAME_HASH_METHOD_NAME: HelloController#sayHello ","tags":[],"defaultValueAsString":"METHOD_NAME_SPLIT_CAMEL_CASE","configurationCategory":"Request Monitor Plugin","valueType":"BusinessTransactionNamingStrategy","valueAsString":"METHOD_NAME_SPLIT_CAMEL_CASE","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.anonymizeIPs","label":"Anonymize IP Addresses","description":"For IPv4 addresses, the last octet is set to zero. If the address is a IPv6 address, the last 80 bits (10 bytes) are set to zero. This is just like Google Analytics handles IP anonymization.","tags":["privacy"],"defaultValueAsString":"true","configurationCategory":"Request Monitor Plugin","valueType":"Boolean","valueAsString":"true","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.pseudonymize.username","label":"Pseudonymize Usernames","description":"Stagemonitor collects the user names which may be a privacy issue. If set to true, the user name will be pseudonymized (SHA1 hashed).","tags":["privacy"],"defaultValueAsString":"false","configurationCategory":"Request Monitor Plugin","valueType":"Boolean","valueAsString":"false","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.disclose.users","label":"Disclose users","description":"When you pseudonymize user names and detect that a specific user seems malicious, you can disclose their real user name to make further investigations. Also, the IP won't be anonymized anymore for these users. If pseudonymizing user names is active you can specify a list of user name pseudonyms to disclose. If not, just use the plain user names to disclose their IP address.","tags":["privacy"],"defaultValueAsString":"","configurationCategory":"Request Monitor Plugin","valueType":"Collection","valueAsString":"","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.requestmonitor.onlyReportRequestsWithNameToElasticsearch","label":"Only report request traces with name to ES","description":"Limits the reporting of request traces to Elasticsearch to requests with a certain name.","tags":[],"defaultValueAsString":"","configurationCategory":"Request Monitor Plugin","valueType":"Collection","valueAsString":"","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.requestmonitor.onlyReportNRequestsPerMinuteToElasticsearch","label":"Only report N requests per minute to ES","description":"Limits the rate at which request traces are reported to Elasticsearch. Set to a value below 1 to deactivate ES reporting and to 1000000 or higher to always report.","tags":[],"defaultValueAsString":"1000000.0","configurationCategory":"Request Monitor Plugin","valueType":"Double","valueAsString":"1000000.0","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.requestmonitor.elasticsearch.onlyLogElasticsearchRequestTraceReports","label":"Only log Elasticsearch request trace reports","description":"If set to true, the request traces won't be reported to elasticsearch but instead logged in bulk format. The name of the logger is ElasticsearchRequestTraces. That way you can redirect the reporting to a separate log file and use logstash or a different external process to send the request traces to elasticsearch.","tags":[],"defaultValueAsString":"false","configurationCategory":"Request Monitor Plugin","valueType":"Boolean","valueAsString":"false","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.requestmonitor.elasticsearch.excludeCallTreeFromElasticsearchReportWhenFasterThanXPercentOfRequests","label":"Exclude the Call Tree from Elasticsearch reports on x% of the fastest requests","description":"Exclude the Call Tree from Elasticsearch report when the request was faster faster than x percent of requests with the same request name. This helps to reduce the network and disk overhead as uninteresting Call Trees (those which are comparatively fast) are excluded.Example: set to 1 to always exclude the Call Tree and to 0 to always include it. With a setting of 0.85, the Call Tree will only be reported for the slowest 25% of the requests.","tags":[],"defaultValueAsString":"0.0","configurationCategory":"Request Monitor Plugin","valueType":"Double","valueAsString":"0.0","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.requestmonitor.unnestExeptions","label":"Unnest Exceptions","description":"Some Exceptions are so called 'nested exceptions' which wrap the actual cause of the exception. A prominent example is Spring's NestedServletException. In those cases it makes sense to unnest the exception to see the actual cause in the request analysis dashboard.","tags":[],"defaultValueAsString":"org.springframework.web.util.NestedServletException","configurationCategory":"Request Monitor Plugin","valueType":"Collection","valueAsString":"org.springframework.web.util.NestedServletException","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.requestmonitor.ignoreExeptions","label":"Ignore Exceptions","description":"The class names of exception to ignore. These exceptions won't show up in the request trace and won't cause the error flag of the request trace to be set to true.","tags":[],"defaultValueAsString":"","configurationCategory":"Request Monitor Plugin","valueType":"Collection","valueAsString":"","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.requestmonitor.params.confidential.regex","label":"Confidential parameters (regex)","description":"A list of request parameter name patterns that should not be collected.nIn the context of a HTTP request, a request parameter is either a query string or a application/x-www-form-urlencoded request body (POST form content). In the context of a method invocation monitored with @MonitorRequests,this refers to the parameter name of the monitored method. Note that you have to compile your classeswith 'vars' debug information.","tags":["security-relevant"],"defaultValueAsString":"(?i).*pass.*, (?i).*credit.*, (?i).*pwd.*, (?i)pw","configurationCategory":"Request Monitor Plugin","valueType":"Collection","valueAsString":"(?i).*pass.*, (?i).*credit.*, (?i).*pwd.*, (?i)pw","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.requestmonitor.elasticsearch.requestIndexTemplate","label":"ES Request Index Template","description":"The classpath location of the index template that is used for the stagemonitor-requests-* indices. By specifying the location to your own template, you can fully customize the index template.","tags":["elasticsearch"],"defaultValueAsString":"stagemonitor-elasticsearch-request-index-template.json","configurationCategory":"Request Monitor Plugin","valueType":"String","valueAsString":"stagemonitor-elasticsearch-request-index-template.json","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.requestmonitor.elasticsearch.externalRequestsIndexTemplate","label":"ES External Requests Index Template","description":"The classpath location of the index template that is used for the stagemonitor-external-requests-* indices. By specifying the location to your own template, you can fully customize the index template.","tags":["elasticsearch"],"defaultValueAsString":"stagemonitor-elasticsearch-external-requests-index-template.json","configurationCategory":"Request Monitor Plugin","valueType":"String","valueAsString":"stagemonitor-elasticsearch-external-requests-index-template.json","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.requestmonitor.external.onlyReportNExternalRequestsPerMinute","label":"Only report N external requests per minute to ES","description":"Limits the rate at which external request traces are reported to Elasticsearch. Set to a value below 1 to deactivate ES reporting and to 1000000 or higher to always report.","tags":["external-requests"],"defaultValueAsString":"0.0","configurationCategory":"Request Monitor Plugin","valueType":"Double","valueAsString":"0.0","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.requestmonitor.external.excludeExternalRequestsWhenFasterThanXPercent","label":"Exclude external requests from reporting on x% of the fastest external requests","description":"Exclude the external request from Elasticsearch report when the request was faster faster than x percent of external requests with the same initiator (executedBy). This helps to reduce the network and disk overhead as uninteresting external requests (those which are comparatively fast) are excluded.Example: set to 1 to always exclude the external request and to 0 to always include it. With a setting of 0.85, the external request will only be reported for the slowest 25% of the requests.","tags":["external-requests"],"defaultValueAsString":"0.0","configurationCategory":"Request Monitor Plugin","valueType":"Double","valueAsString":"0.0","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.requestmonitor.external.excludeExternalRequestsFasterThan","label":"Exclude external requests from reporting when faster than x ms","description":"Exclude the external request from Elasticsearch report when the request was faster faster than x ms.","tags":["external-requests"],"defaultValueAsString":"0.0","configurationCategory":"Request Monitor Plugin","valueType":"Double","valueAsString":"0.0","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null}],"JDBC Plugin":[{"dynamic":false,"sensitive":false,"key":"stagemonitor.profiler.jdbc.collectSql","label":"Collect SQLs in call tree","description":"Whether or not sql statements should be included in the call stack.","tags":[],"defaultValueAsString":"true","configurationCategory":"JDBC Plugin","valueType":"Boolean","valueAsString":"true","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.profiler.jdbc.collectPreparedStatementParameters","label":"Collect prepared statement parameters","description":"Whether or not the prepared statement placeholders (?) should be replaced with the actual parameters.","tags":["security-relevant"],"defaultValueAsString":"true","configurationCategory":"JDBC Plugin","valueType":"Boolean","valueAsString":"true","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.instrument.jdbc.dataSource.implementations","label":"Class name of DataSource implementations","description":"The class name of all known javax.sql.DataSource implementations. If your favourite implementation is not listed here, just add it to the list.","tags":[],"defaultValueAsString":"org.apache.tomcat.jdbc.pool.DataSource, org.apache.tomcat.dbcp.dbcp.PoolingDataSource, org.apache.tomcat.jdbc.pool.DataSourceProxy, org.apache.commons.dbcp2.PoolingDataSource, org.apache.commons.dbcp.PoolingDataSource, com.mchange.v2.c3p0.AbstractPoolBackedDataSource, com.mchange.v2.c3p0.PoolBackedDataSource, com.mchange.v2.c3p0.ComboPooledDataSource, com.jolbox.bonecp.BoneCPDataSource, snaq.db.DBPoolDataSource, com.zaxxer.hikari.HikariDataSource, org.jboss.jca.adapters.jdbc.WrapperDataSource, org.springframework.jdbc.datasource.AbstractDriverBasedDataSource","configurationCategory":"JDBC Plugin","valueType":"Collection","valueAsString":"org.apache.tomcat.jdbc.pool.DataSource, org.apache.tomcat.dbcp.dbcp.PoolingDataSource, org.apache.tomcat.jdbc.pool.DataSourceProxy, org.apache.commons.dbcp2.PoolingDataSource, org.apache.commons.dbcp.PoolingDataSource, com.mchange.v2.c3p0.AbstractPoolBackedDataSource, com.mchange.v2.c3p0.PoolBackedDataSource, com.mchange.v2.c3p0.ComboPooledDataSource, com.jolbox.bonecp.BoneCPDataSource, snaq.db.DBPoolDataSource, com.zaxxer.hikari.HikariDataSource, org.jboss.jca.adapters.jdbc.WrapperDataSource, org.springframework.jdbc.datasource.AbstractDriverBasedDataSource","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null}],"Core":[{"dynamic":true,"sensitive":false,"key":"stagemonitor.active","label":"Activate stagemonitor","description":"If set to `false` stagemonitor will be completely deactivated.","tags":[],"defaultValueAsString":"true","configurationCategory":"Core","valueType":"Boolean","valueAsString":"true","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.internal.monitoring","label":"Internal monitoring","description":"If active, stagemonitor will collect internal performance data","tags":[],"defaultValueAsString":"false","configurationCategory":"Core","valueType":"Boolean","valueAsString":"false","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.reporting.interval.console","label":"Reporting interval console","description":"The amount of time between console reports (in seconds). To deactivate console reports, set this to a value below 1.","tags":[],"defaultValueAsString":"0","configurationCategory":"Core","valueType":"Integer","valueAsString":"0","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.reporting.interval.aggregation","label":"Metrics aggregation interval","description":"The amount of time between all registered metrics are aggregated for a report on server shutdown that shows aggregated values for all metrics of the measurement session. To deactivate a aggregate report on shutdown, set this to a value below 1.","tags":[],"defaultValueAsString":"30","configurationCategory":"Core","valueType":"Integer","valueAsString":"30","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.reporting.jmx","label":"Expose MBeans","description":"Whether or not to expose all metrics as MBeans.","tags":[],"defaultValueAsString":"false","configurationCategory":"Core","valueType":"Boolean","valueAsString":"false","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.reporting.interval.graphite","label":"Reporting interval graphite","description":"The amount of time between the metrics are reported to graphite (in seconds).nTo deactivate graphite reporting, set this to a value below 1, or don't provide stagemonitor.reporting.graphite.hostName.","tags":["metrics-store","graphite"],"defaultValueAsString":"60","configurationCategory":"Core","valueType":"Integer","valueAsString":"60","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.reporting.graphite.hostName","label":"Graphite host name","description":"The name of the host where graphite is running. This setting is mandatory, if you want to use the grafana dashboards.","tags":["metrics-store","graphite"],"defaultValueAsString":null,"configurationCategory":"Core","valueType":"String","valueAsString":null,"nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.reporting.graphite.port","label":"Carbon port","description":"The port where carbon is listening.","tags":["metrics-store","graphite"],"defaultValueAsString":"2003","configurationCategory":"Core","valueType":"Integer","valueAsString":"2003","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.reporting.influxdb.url","label":"InfluxDB URL","description":"The URL of your InfluxDB installation.","tags":["metrics-store","influx-db"],"defaultValueAsString":null,"configurationCategory":"Core","valueType":"String","valueAsString":null,"nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.reporting.influxdb.db","label":"InfluxDB database","description":"The target database","tags":["metrics-store","influx-db"],"defaultValueAsString":"stagemonitor","configurationCategory":"Core","valueType":"String","valueAsString":"stagemonitor","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.reporting.interval.influxdb","label":"Reporting interval InfluxDb","description":"The amount of time between the metrics are reported to InfluxDB (in seconds).","tags":["metrics-store","influx-db"],"defaultValueAsString":"60","configurationCategory":"Core","valueType":"Integer","valueAsString":"60","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.reporting.interval.elasticsearch","label":"Reporting interval Elasticsearch","description":"The amount of time between the metrics are reported to Elasticsearch (in seconds).","tags":["metrics-store","elasticsearch"],"defaultValueAsString":"60","configurationCategory":"Core","valueType":"Integer","valueAsString":"60","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.reporting.elasticsearch.onlyLogElasticsearchMetricReports","label":"Only log Elasticsearch metric reports","description":"If set to true, the metrics won't be reported to elasticsearch but instead logged in bulk format. The name of the logger is ElasticsearchMetrics. That way you can redirect the reporting to a separate log file and use logstash or a different external process to send the metrics to elasticsearch.","tags":["metrics-store","elasticsearch"],"defaultValueAsString":"false","configurationCategory":"Core","valueType":"Boolean","valueAsString":"false","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.reporting.elasticsearch.deleteMetricsAfterDays","label":"Delete ES metrics after (days)","description":"The number of days after the metrics stored in elasticsearch should be deleted. Set below 1 to deactivate.","tags":["metrics-store","elasticsearch"],"defaultValueAsString":"-1","configurationCategory":"Core","valueType":"Integer","valueAsString":"-1","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.elasticsearch.hotColdArchitecture.moveToColdNodesAfterDays","label":"Activate Hot-Cold Architecture","description":"Setting this to a value > 1 activates the hot-cold architecture described in https://www.elastic.co/blog/hot-warm-architecture where new data that is more frequently queried and updated is stored on beefy nodes (SSDs, more RAM and CPU). When the indexes reach a certain age, they are allocated on cold nodes. For this to work, you have to tag your beefy nodes with node.box_type: hot (either in elasticsearch.yml or start the node using ./bin/elasticsearch --node.box_type hot)and your historical nodes with node.box_type: cold.","tags":["metrics-store","elasticsearch"],"defaultValueAsString":"-1","configurationCategory":"Core","valueType":"Integer","valueAsString":"-1","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.applicationName","label":"Application name","description":"The name of the application.nEither this property or the display-name in web.xml is mandatory!","tags":["important"],"defaultValueAsString":null,"configurationCategory":"Core","valueType":"String","valueAsString":null,"nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.instanceName","label":"Instance name","description":"The instance name.nIf this property is not set, the instance name set to the first request's javax.servlet.ServletRequest#getServerName()nThat means that the collection of metrics does not start before the first request is executed!","tags":["important"],"defaultValueAsString":null,"configurationCategory":"Core","valueType":"String","valueAsString":null,"nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.hostName","label":"Host name","description":"The host name.nIf this property is not set, the host name will default to resolving the host name for localhost, if this fails it will be loaded from the environment, either from COMPUTERNAME or HOSTNAME.","tags":[],"defaultValueAsString":"N51.local","configurationCategory":"Core","valueType":"String","valueAsString":"N51.local","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.elasticsearch.url","label":"Elasticsearch URL","description":"A comma separated list of the Elasticsearch URLs that store the request traces and metrics.","tags":["elasticsearch"],"defaultValueAsString":"","configurationCategory":"Core","valueType":"List","valueAsString":"","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.elasticsearch.configurationSourceProfiles","label":"Elasticsearch configuration source profiles","description":"Set configuration profiles of configuration stored in elasticsearch as a centralized configuration source that can be shared between multiple server instances. Set the profiles appropriate to the current environment e.g. `production,common`, `local`, `test`, ... The configuration will be stored under `{stagemonitor.elasticsearch.url}/stagemonitor/configuration/{configurationSourceProfile}`.","tags":[],"defaultValueAsString":"","configurationCategory":"Core","valueType":"Collection","valueAsString":"","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.elasticsearch.configurationSource.deactivateStagemonitorIfEsIsDown","label":"Deactivate stagemonitor if elasticsearch configuration source is down","description":"Set to true if stagemonitor should be deactivated if stagemonitor.elasticsearch.configurationSourceProfiles is set but elasticsearch can't be reached under stagemonitor.elasticsearch.url. Defaults to true to prevent starting stagemonitor with wrong configuration.","tags":[],"defaultValueAsString":"true","configurationCategory":"Core","valueType":"Boolean","valueAsString":"true","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.metrics.excluded.pattern","label":"Excluded metric names","description":"A comma separated list of metric names that should not be collected.","tags":[],"defaultValueAsString":"","configurationCategory":"Core","valueType":"Collection","valueAsString":"","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.plugins.disabled","label":"Disabled plugins","description":"A comma separated list of plugin names (the simple class name) that should not be active.","tags":[],"defaultValueAsString":"","configurationCategory":"Core","valueType":"Collection","valueAsString":"","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.configuration.reload.interval","label":"Configuration reload interval","description":"The interval in seconds a reload of all configuration sources is performed. Set to a value below `1` to deactivate periodic reloading the configuration.","tags":[],"defaultValueAsString":"60","configurationCategory":"Core","valueType":"Integer","valueAsString":"60","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.instrument.exclude","label":"Excluded packages","description":"Exclude packages and their sub-packages from the instrumentation (for example the profiler).","tags":[],"defaultValueAsString":"","configurationCategory":"Core","valueType":"Collection","valueAsString":"","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.instrument.excludeContaining","label":"Exclude containing","description":"Exclude classes from the instrumentation (for example from profiling) that contain one of the following strings as part of their class name.","tags":[],"defaultValueAsString":"$JaxbAccessor, $$, CGLIB, EnhancerBy, $Proxy","configurationCategory":"Core","valueType":"Collection","valueAsString":"$JaxbAccessor, $$, CGLIB, EnhancerBy, $Proxy","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.instrument.include","label":"Included packages","description":"The packages that should be included for instrumentation (for example the profiler). If this property is empty, all packages (except for the excluded ones) are instrumented. You can exclude subpackages of a included package via `stagemonitor.instrument.exclude`.","tags":[],"defaultValueAsString":"","configurationCategory":"Core","valueType":"Collection","valueAsString":"","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.instrument.runtimeAttach","label":"Attach agent at runtime","description":"Attaches the agent via the Attach API at runtime and retransforms all currently loaded classes.","tags":[],"defaultValueAsString":"true","configurationCategory":"Core","valueType":"Boolean","valueAsString":"true","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.instrument.excludedInstrumenter","label":"Excluded Instrumenters","description":"A list of the simple class names of StagemonitorByteBuddyTransformers that should not be applied","tags":[],"defaultValueAsString":"","configurationCategory":"Core","valueType":"Collection","valueAsString":"","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.instrument.debug","label":"Debug instrumentation","description":"Set to true to log additional information and warnings during the instrumentation process.","tags":[],"defaultValueAsString":"false","configurationCategory":"Core","valueType":"Boolean","valueAsString":"false","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.grafana.url","label":"Grafana URL","description":"The URL of your Grafana 2.0 installation","tags":["grafana"],"defaultValueAsString":null,"configurationCategory":"Core","valueType":"String","valueAsString":null,"nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":true,"key":"stagemonitor.grafana.apiKey","label":"Grafana API Key","description":"The API Key of your Grafana 2.0 installation. See http://docs.grafana.org/reference/http_api/#create-api-token how to create a key. The key has to have the admin role. This is necessary so that stagemonitor can automatically add datasources and dashboards to Grafana.","tags":["grafana"],"defaultValueAsString":null,"configurationCategory":"Core","valueType":"String","valueAsString":null,"nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":false,"sensitive":false,"key":"stagemonitor.threadPools.queueCapacityLimit","label":"Thread Pool Queue Capacity Limit","description":"Sets a limit to the number of pending tasks in the ExecutorServices stagemonitor uses. These are thread pools that are used for example to report request traces to elasticsearch. If elasticsearch is unreachable or your application encounters a spike in incoming requests this limit could be reached. It is used to prevent the queue from growing indefinitely. ","tags":["advanced"],"defaultValueAsString":"1000","configurationCategory":"Core","valueType":"Integer","valueAsString":"1000","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null},{"dynamic":true,"sensitive":false,"key":"stagemonitor.reporting.elasticsearch.metricsIndexTemplate","label":"ES Metrics Index Template","description":"The classpath location of the index template that is used for the stagemonitor-metrics-* indices. By specifying the location to your own template, you can fully customize the index template.","tags":["metrics-store","elasticsearch"],"defaultValueAsString":"stagemonitor-elasticsearch-metrics-index-template.json","configurationCategory":"Core","valueType":"String","valueAsString":"stagemonitor-elasticsearch-metrics-index-template.json","nameOfCurrentConfigurationSource":"Default Value","errorMessage":null}]};

					stagemonitorWindow.stagemonitor.measurementSession = {"applicationName": "Spring PetClinic","hostName": "n51","instanceName": "localhost","startTimestamp": "2015-03-07T16:14:26.416+0100","endTimestamp": null,"endTimestampEpoch": null,"startTimestampEpoch": 1425741266416};
					stagemonitorWindow.stagemonitor.pathsOfTabPlugins = ["/stagemonitor-alerting/src/main/resources/stagemonitor/static/tabs/alert/alerting-tab"];
					var connectionId = generateUUID();
					addXMLRequestCallback( function( xhr ) {
						xhr.setRequestHeader("x-stagemonitor-connection-id", connectionId);
					});

					stagemonitorWindow.stagemonitor.openOverlay = function () {
						stagemonitorOverlay.style.display = "block";
						stagemonitorWindow.stagemonitor.onOpen();
						stagemonitorWindow.focus();
					};

					stagemonitorWindow.stagemonitor.closeOverlay = function () {
						stagemonitorOverlay.style.display = "none";
					};

					stagemonitorWindow.stagemonitor.initialize(data, configurationSources, configurationOptions,
							"http://localhost:9966/petclinic", contextPath, true, connectionId,
							[
								"/stagemonitor-requestmonitor/src/main/resources/stagemonitor/static/tabs/metrics/request-metrics",
								"/stagemonitor-jdbc/src/main/resources/stagemonitor/static/tabs/metrics/jdbc-metrics",
								"/stagemonitor-logging/src/main/resources/stagemonitor/static/tabs/metrics/logging-metrics",
								"/stagemonitor-jvm/src/main/resources/stagemonitor/static/tabs/metrics/jvm-metrics",
								"/stagemonitor-ehcache/src/main/resources/stagemonitor/static/tabs/metrics/ehcache-metrics",
								"/stagemonitor-os/src/main/resources/stagemonitor/static/tabs/metrics/os-metrics"
							], true);

					var thresholdExceeded = stagemonitorWindow.stagemonitor.thresholdExceeded;
					stagemonitorOverlayShow.className = thresholdExceeded ? "stagemonitor-threshold-exceeded" : "stagemonitor-threshold-ok";
					stagemonitorOverlayShow.addEventListener("click", stagemonitorWindow.stagemonitor.openOverlay);
					stagemonitorWindow.stagemonitor.openOverlay();
				}
			};

			function generateUUID(){
				var d = new Date().getTime();
				return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
					var r = (d + Math.random() * 16) % 16 | 0;
					d = Math.floor(d / 16);
					return (c == 'x' ? r : (r & 0x7 | 0x8)).toString(16);
				});
			}

			function addXMLRequestCallback(callback){
				var oldSend, i;
				if( XMLHttpRequest.callbacks ) {
					// we've already overridden send() so just add the callback
					XMLHttpRequest.callbacks.push( callback );
				} else {
					// create a callback queue
					XMLHttpRequest.callbacks = [callback];
					// store the native send()
					oldSend = XMLHttpRequest.prototype.send;
					// override the native send()
					XMLHttpRequest.prototype.send = function(){
						// process the callback queue
						// the xhr instance is passed into each callback but seems pretty useless
						// you can't tell what its destination is or call abort() without an error
						// so only really good for logging that a request has happened
						// I could be wrong, I hope so...
						// EDIT: I suppose you could override the onreadystatechange handler though
						for( i = 0; i < XMLHttpRequest.callbacks.length; i++ ) {
							XMLHttpRequest.callbacks[i]( this );
						}
						// call the native send()
						oldSend.apply(this, arguments);
					}
				}
			}

		}());
	</script>
	<style>
		#stagemonitor-overlay {
			position: fixed;
			background-color: rgba(0, 0, 0, 0.5);
			width: 100%;
			height: 100%;
			z-index: 100000;
			top: 0;
			left: 0;
		}

		#stagemonitor-overlay-show:hover {
			background-color: rgba(0, 0, 0, 0.6);
		}

		#stagemonitor-overlay-show {
			position: fixed;
			right: 3em;
			bottom: 3em;
			border-radius: 1em;
			padding: 0.5em;
			cursor: pointer;
		}

		.stagemonitor-threshold-ok {
			background-color: rgba(0, 0, 0, 0.5);
		}

		.stagemonitor-threshold-exceeded {
			background-color: #bf3636;
			-webkit-animation: togglebackground 4s infinite;
			animation: togglebackground 4s infinite;
		}

		@-webkit-keyframes togglebackground {
			0%   {background-color: rgba(0, 0, 0, 0.5);}
			30%  {background-color: #bf3636}
			60%  {background-color: #bf3636}
			100% {background-color: rgba(0, 0, 0, 0.5);}
		}

		@keyframes togglebackground {
			0%   {background-color: rgba(0, 0, 0, 0.5);}
			30%  {background-color: #bf3636}
			60%  {background-color: #bf3636}
			100% {background-color: rgba(0, 0, 0, 0.5);}
		}

		#stagemonitor-modal {
			height: 100%;
			width: 100%;
		}
	</style>

	<div id="stagemonitor-overlay-show" class="stagemonitor-threshold-ok">
		<img src="../../main/resources/stagemonitor/static/stagemonitor.png" />
	</div>

</body>
</html>

